陣列[]
:是一組相同型態的連續變數,它們使用同一個變數名稱,而另外用一個索引值來指定使用第幾個變數。在方括號[]
裡放進同類型的元素,而在Ruby世界的陣列能夠容納各種型別的物件。
x = Array.new
y = []
Array = [1,2,3,4,5,"aa"]
%w
,會建立字串的陣列Array = %w(aa bb nn)
p Array
-> # 印出 ["aa", "bb", "nn"]
使用索引號碼可以指向陣列的任何部分,位置從0開始計算,使用方法如下。
food = ['豆腐', '素漢堡', '素pizza', '素手捲', '素糕', '薯條']
puts food[0] -> # 印出 豆腐
puts food[1] -> # 印出 素漢堡
puts food[-1] -> # 印出 薯條
puts food[-2] -> # 印出 素糕
# 或是使用ruby的內建方法
puts food.first -> # 印出 豆腐
puts food.last -> # 印出 薯條
# 計算陣列內元素個數
puts food.length -> # 印出 6
food << '堅果奶茶' -> #在陣列的最後面加一個人
puts food.length -> # 印出 7
food.push('燕麥奶茶') -> # 正規的方法
puts food.length -> # 印出 8
有了陣列之後,我們可以利用陣列做邏輯運算,而Ruby內建也建立許多快速好用的方法,方便使用者。而要獲得這些方法,則是需要好好閱讀文件,熟悉用法,以協助更熟練使用Ruby語言唷!(Ruby Array 手冊)
以下介紹會介紹幾個常用的方法。
*定義
對Array裡的每個元素「進行計算」,並收集成一個新的Array。
同義詞:collect
Array = [1,2,3,4,5]
# {}裡寫下條件,以下範例為:讓陣列裡每個元素都乘以兩倍。
p Array.map {|x| x * 2 }
# 使用同義詞collect也可以達到同樣的效果。
p Array.collect {|x| x * 2 }
# 以下範例的運算為變成「平方」。
p Array.map {|x| x * x }
*定義
從集合裡「篩選符合條件」的元素,並收集成一個新的集合。
同義詞:filter
反義詞:reject
以下使用到的(1..10)
為範圍,展開後為[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
。
# 將條件寫在{}裡,以下範例為:篩選小於5的數字。
p (1..10).select { |x| x < 5 }
-> # 印出來 [1,2,3,4]
# 使用反義詞,則會篩遠出相反的數字。
p (1..10).reject { |x| x < 5 }
-> # 印出來 [5, 6, 7, 8, 9, 10]
定義
對集合裡的每個元素「進行運算」,並將所有的運算結果歸納成一個「單一結果」。
同義詞:inject
# sum為總和的意思,以下案例為:1+2+3...+10的數學運算
p(1..10).reduce { |sum, x| sum + x }
-> # 印出來 55
若沒有這個方法的話則需要自己寫一個迴圈,寫Ruby是不是方便很多呢!
為Ruby的特點,很多程式語言沒有這樣的設計。使用()
和.
來縮寫想要表達一串的元素。直接看範例會比較清楚。
..
,較常使用。puts (1..10).to_a -> # 印出 1~10
(1..10)
# 展開範圍 1~10
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
('a'..'z') # 範圍 a~z
('A'..'Z') # 範圍 A~Z
使用三個...
,建議不要使用,避免混淆。puts (1...10).to_a -> # 印出 1~9
也可以結合迴圈、條件式......等使用。
for i in 1..10
puts i
end
或是以下case...when
age = 10
case age
when 0..3
puts "嬰兒"
when 4..10
puts "兒童"
when 11..17
puts "青少年"
else
puts "成年"
end
請參考Ruby Array 手冊來完成以下題目。
1. 把陣列[7, 8, 9]塞入三組同樣的數字,如[7, 8, 9, 7, 8, 9, 7, 8, 9, 7, 8, 9]。
2. 把陣列[1,3,4,1,7,nil,7]由小到大排序,並移除「nil」以及「重複」的數字。
3. 印出5個小於100且不重複的亂數
1. [7, 8, 9] * 4 -> [7, 8, 9, 7, 8, 9, 7, 8, 9, 7, 8, 9]
2. [1,3,4,1,7,nil,7].compact.sort.unip -> [1,3,4,7]
3. p (1..52).to_a.shuffle.first(5)
或使用取樣方法 p (1..100).to_a.sample(5)